package beer.xz.beer.device.comm.protocol

import java.util.Date

/**
 * 啤酒机状态数据模型
 * 表示从啤酒机上报的状态数据
 */
data class BeerMachineStatus(
    // 基本信息
    val timestamp: Date = Date(),                // 数据接收时间戳

    // 温度和重量数据
    val temperature: Int = 0,                    // 温度值 (°C)
    val beerBottleWeight: Float = 0f,            // 重量1 - 酒瓶重量 (kg)
    val outputBeerWeight: Float = 0f,            // 重量2 - 出酒量 (kg)
    val bottlePressure: Float = 0f,              // 重量3 - 罐装酒瓶压力 (kg)
    val co2Pressure: Float = 0f,                 // 重量4 - 二氧化碳压强 (kg)

    // 电机和流量数据
    val motorPosition: Float = 0f,               // 电机行程量
    val flowCount: Float = 0f,                   // 流量计数

    // 运行时间
    val runningTimeMs: Long = 0,                 // 开机运行的毫秒数

    // 输入开关标志位
    val inputSwitchFlags: List<Long> = List(10) { 0L },  // 输入开关标志位

    // 故障码
    val hardwareFaultCode: Long = 0,             // 硬件故障码
    val softwareFaultCode: Long = 0,             // 软件故障码

    // 设备信息
    val deviceId: Long = 0,                      // 设备ID码
    val softwareVersion: Long = 0,               // 软件版本号
    val hardwareVersion: Long = 0,               // 硬件版本号

    // 标志位
    val relayOutputFlag: Byte = 0,               // 继电器输出标志位
    val runningFlag: Byte = 0,                   // 运行标志位
    val dataType: Byte = 0                       // 数据类型 (0=测试数据, 1=系统参数)
) {
    /**
     * 故障类型枚举
     */
    enum class FaultType(val bitPosition: Int) {
        NO_BEER(1),           // 无酒
        NO_PRESSURE(2),       // 无气压
        TIMEOUT(3),           // 运行超时
        OVER_TEMPERATURE(4)   // 冷柜超温
    }

    /**
     * 检查是否有特定类型的硬件故障
     * @param faultType 故障类型
     * @return 如果有该类型故障返回true，否则返回false
     */
    fun hasHardwareFault(faultType: FaultType): Boolean {
        return (hardwareFaultCode and (1L shl faultType.bitPosition)) != 0L
    }

    /**
     * 获取所有硬件故障的列表
     * @return 故障类型列表
     */
    fun getHardwareFaults(): List<FaultType> {
        return FaultType.values().filter { hasHardwareFault(it) }
    }

    /**
     * 获取设备状态描述
     * @return 状态描述字符串
     */
    fun getStatusDescription(): String {
        val faults = getHardwareFaults()
        return when {
            faults.isNotEmpty() -> "故障: ${faults.joinToString(", ") { it.name }}"
            runningFlag.toInt() and 0x01 != 0 -> "正在酿造"
            runningFlag.toInt() and 0x02 != 0 -> "正在清洗"
            else -> "空闲"
        }
    }

    /**
     * 获取设备信息描述
     * @return 设备信息字符串
     */
    fun getDeviceInfo(): String {
        return "设备ID: $deviceId, 软件版本: $softwareVersion, 硬件版本: $hardwareVersion"
    }

    companion object {
        /**
         * 从原始字节数据创建BeerMachineStatus对象
         * @param data 原始字节数据
         * @return BeerMachineStatus对象，如果数据无效则返回null
         */
        fun fromByteArray(data: ByteArray): BeerMachineStatus? {
            // 使用BeerProtocolImpl来解析数据
            return BeerProtocolImpl().decodeData(data)
        }
    }
}
